﻿#define _CRT_SECURE_NO_WARNINGS 1

//#include <stdio.h>
//#include <assert.h>
//#include <string.h>
//
//size_t myStrlen(const char* str)
//{
//	size_t count = 0;
//	assert(str != NULL);
//
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//
//	return count;
//}
//
//
//
//int main()
//{
//	//strlen 实现
//	char arr[] = "abcdefg";
//	size_t ret = strlen(arr);
//	printf("%zd \n", ret);
//
//
//	//myStrlen 模拟
//	char arr2[] = "abcdefgh";
//	size_t ret2 = myStrlen(arr2);
//	printf("%zd ", ret2);
//}

//#include <stdio.h>

//void swap(int x, int y)   // 值传递  因此函数内变量交换并不会改变原传入的值
//{
//	int tmp = 0;
//	tmp = x;
//	x = y;
//	y = tmp;
//}

//当形参传递 值 給实参的时候 ， 实参只是形参的临时拷贝
//实参的修改 并不会影响到形参


//void swap(int* x, int* y)   // 地址传递  因为是传递的是地址，
//                            // 地址只有一个，所以无论是谁修改对应的内容，内容都改变
//{
//	int tmp = 0;
//	tmp = *x;
//	*x = *y;
//	*y = tmp;
//}
//
//
//int main()
//{
//	//利用一个函数 交换两个变量的值
//	
//	int a = 10;
//	int b = 20;
//	printf("交换前a=%d b=%d\n", a, b);
//	//swap(a, b);//传值调用
//	swap(&a, &b);// 传址调用
//	printf("交换后a=%d b=%d\n", a, b);
//}

//#include <stdio.h>
//
//int main()
//{
//	int a = 10;
//
//	int* p = &a;
//	//那么存储现在知道怎么做了，那要使用的话怎么办呢？
//
//	*p;// (*)解引用操作符  作用：通过找p中储存的地址,  从而找到原地址(a)对应的值
//
//	*p = 0; //  这里就是p通过（*） 解引用找到地址,  并且修改a内容 变为0
//	//  ps: 不知有没有小伙伴想到 
//	// (&) 可以取地址     (*) 可以解地址 ,那有没有可能他们两个放在一起时就可以互相抵消呢?
//	// 答案是可以的 以此处为例： *p 实际上就是 *&a  那么结果就是a 所对应的值  
//	printf("a=%d ", *p);
//
//
//	//而 众多的指针类型 你或许会认为他们所占的空间不太相同 但实际上他们所占字节是完全相同的
//	//原因就与地址线的数量有关
//	//在32位环境下  指针变量大小所占字节都是 4个字节
//	//在64位环境下  指针变量大小所占字节都是 8个字节
//	//指针变量大小 于它类型无关
//
//
//	//指针类型决定了指针进行解引用操作符的时候访问几个字节,也就是决定了指针有多大权限!
//
//	
//
//	return 0;
//}

//#include <stdio.h>
//
//int main()
//{
//	int a = 0x11223344;//这里还涉及到大小端存储的内容，
//	//                   在后面的文章中会详细说，这里不知道并不影响理解
//	char* pc = &a;
//	int* pt = &a;
//
//	*pc = 0;
//	*pt = 0;
//}






//
//
//int main()
//{
//	int a = 10;
//	char* pc = &a;
//	int* pi = &a;
//
//	void* pv = &a;
//}
//#include <stdio.h> 
//int main()
//{
//
//	int a = 0;
//	int* pa = &a;
//	char* pc = &a;
//
//	printf("pa  =%p\n", pa);
//	printf("pa+1=%p\n ", pa + 1);
//	printf("pc  =%p\n", pc);
//	printf("pc+1=%p\n", pc + 1);

	//指针类型决定了指针 +1 , -1 向后走几个字节
	// int*  +1  ---> 向后走4个字节
	// char* +1  ---> 向后走1个字节

	//结论：指针的类型决定了指针向前或者向后走⼀步有多大（距离）
//}
//int a = 0;
//int* pa = &a;
//char* pc = &a;
//
//printf("pa=%p\n", pa);
//printf("pa+1=%p\n ", pa + 1);
//printf("pc=%p\n", pc);
//printf("pc+1=%p\n", pc + 1);
//
////指针类型决定了指针 +1 , -1 向后走几个字节
//// int*  +1  ---> 向后走4个字节
//// char* +1  ---> 向后走1个字节
//
////结论：指针的类型决定了指针向前或者向后走⼀步有多大（距离）


#include <stdio.h>
int main()
{
	/*const int a = 10;
	a = 20;*/






	//int a = 10;
	//int b = 30;

	////情况3  const在 * 左右两边
	//int const* const pa = &a;
	//pa = &b;
	//*pa = 20;
	//printf("a=%d", a);// 此处a的值已经被改为20











	////情况2    const在 * 左边
	//int const* constpa = &a;
	//pa = &b;
	////*pa = 20;
	//printf("%d ", *pa);


}